import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { Encrypt, Decrypt } from '@/utils/tools/crypto'

/**
 * 权限设置leve :
 *   1 - 表示系统管理员（学校后勤部）
 *   2 - 表示宿管
 *   3 - 表示教师
 *   4 - 表示学生
 *
 * */

export const useUserStore = defineStore('userStore', () => {
	// 管理员头像
	const imageUrl = ref('https://img0.baidu.com/it/u=3569473251,2294120482&fm=253&fmt=auto&app=120&f=JPEG?w=1130&h=694')

	// 假设已经有一个日志库，这里用console.error代替
	function logger(error) {
		console.error('Failed to parse user data:', error)
	}

	// 封装加密解密逻辑
	function decryptUser(data) {
		try {
			return Decrypt(data)
		} catch (error) {
			logger(error)
			return null // 根据实际情况返回合适的值或抛出错误
		}
	}

	// 封装与localStorage交互的逻辑
	const userInfoStorage = {
		get() {
			const storedUserEncrypted = localStorage.getItem('user')
			if (storedUserEncrypted) {
				return decryptUser(storedUserEncrypted)
			}
			return {} // 或者根据业务逻辑返回默认值
		},
		set(val) {
			if (val !== null && typeof val !== 'undefined') {
				// 检查输入值
				try {
					const storedUserEncrypted = Encrypt(JSON.stringify(val))
					localStorage.setItem('user', storedUserEncrypted)
				} catch (error) {
					logger(error)
				}
			}
		},
	}

	// 使用Vue.js的computed属性进行数据绑定
	const userInfo = computed({
		get() {
			return userInfoStorage.get()
		},
		set(val) {
			userInfoStorage.set(val)
		},
	})

	// 说明：aesDecrypt是一个已经实现的加密解密函数，这里不做修改。
	// 展开或合上菜单栏
	const showMenu = ref(false)

	const level = ref('')
	// 获取登录用户的权限
	const limts = computed({
		get() {
			return level.value || localStorage.getItem('level')
		},
		set(val) {
			level.value = val
			localStorage.setItem('level', val)
		},
	})

	return { limts, userInfo, showMenu, imageUrl }
})
